package com.zlx.widget.ExpandTabTextView;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.Transformation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

import com.zlx.widget.R;


/**
 * copyright (C), 2022, 运达科技有限公司
 * fileName ExpandTabTextView
 *
 * @author 王玺权
 * date 2022-07-09 16:42
 * description
 * history
 */
public class ExpandTabTextView extends LinearLayout implements View.OnClickListener {
    private TypedArray typedArray;
    private int textSize;
    private int textColor;
    //声明上下文对象
    private Context context;
    //声明文本视图对象
    private TextView text_view;
    //声明按钮对象
    private ImageView btn;
    //正常显示的行数
    private int line_number = 1;
    //是否被选中
    private boolean isSelect = false;
    int durationMillis = 500;
    private String content="";
    public ExpandTabTextView(Context context) {
        super(context);
    }

    public ExpandTabTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        typedArray = context.obtainStyledAttributes(attrs, R.styleable.ExpandTabText);
        line_number=typedArray.getInteger(R.styleable.ExpandTabText_lineCount,1);
        textColor=typedArray.getColor(R.styleable.ExpandTabText_textColor,context.getResources().getColor(com.yunda.teamspinner.R.color.white));
        textSize=typedArray.getInteger(R.styleable.ExpandTabText_textSize,16);
        //从布局文件中获取展示内容
        LayoutInflater.from(context).inflate(R.layout.text_expand, this, true);
    }

    //在布局展示完毕后调用，因为getLineHeight方法(获取TextView的行高)要等渲染完成后才能得知具体高度
    //行高是指一行文字上方距离下一行文字上方的距离。
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        //从布局文件中获取名叫ll_content的线性布局
//        LinearLayout ll_content = findViewById(R.id.ll_content);
        //设置布局的点击事件
        btn=findViewById(R.id.btn);
//        btn.setText("查看更多");
        btn.setOnClickListener(this);
        //从布局文件中获取text_view的文本视图
        text_view = findViewById(R.id.text_view);
        text_view.setTextColor(textColor);
        text_view.setTextSize(textSize);
        //设置文本的高度为n行文字这么高
        /*TextView的首行和最后一行有一个额外的padding间距，
          这导致实际行高要大于getLineHeight()方法得到的行高
          所以在设置文本高度时：（普通行高+6）*行数
        */

//        if(text_view.getLineCount()<=1){
//            btn.setVisibility(GONE);
//        }

        text_view.setHeight((text_view.getLineHeight() + 8) * line_number);

        text_view.post(new Runnable() {
            @Override
            public void run() {
                btn.setVisibility(text_view.getLineCount() > line_number ? View.VISIBLE : View.GONE);
            }
        });
    }

    //设置文本内容
    public void setText(String content) {
        text_view.setText(content);
        this.content=content;
    }

    //设置文本的资源编号
    public void setText(int id) {
        setText(context.getResources().getString(id));
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn) {
            isSelect = !isSelect;
            //清除文本视图的动画
            text_view.clearAnimation();
            final int deltaValue;
            //获得文本视图的实际高度
            final int startValue = text_view.getHeight();
            if (isSelect) {//如果选中则展开后面的所有文字  getLineCount():获取TextView文字行数
                //结果为新增的文本视图的高度
                deltaValue = (text_view.getLineHeight() + 8) * text_view.getLineCount() - startValue;
//                btn.setText("隐藏更多");

                //翻转icon的180度旋转动画
                RotateAnimation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                animation.setDuration(durationMillis);
                animation.setFillAfter(true);
                btn.startAnimation(animation);
            } else {
                //结果为0
                deltaValue = (text_view.getLineHeight() + 8) * line_number - startValue;
//                btn.setText("查看更多");


                //翻转icon的180度旋转动画
                RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                animation.setDuration(durationMillis);
                animation.setFillAfter(true);
                btn.startAnimation(animation);
            }
            //创建一个文字展开 收缩动画
            Animation animation = new Animation() {
                //该方法就是动画的具体实现
                /*
                    第一个参数：interpolatedTime代表动画的时间进行比。
                    不管动画实际的持续时间如何，当动画播放时，该参数总是自动从0变化到1
                    第二个参数：Transformation t代表了补间动画在不同时刻对图形或组件的变形程度。
                 */
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    //随着时间的流逝重新设置文本的行高
                    text_view.setHeight((int) (startValue + deltaValue * interpolatedTime));
                }
            };
            //设置动画的持续时间为500毫秒
            animation.setDuration(durationMillis);
            //开始文本视图的动画展示
            text_view.startAnimation(animation);
            text_view.setText(content);
        }
    }

    public ImageView getBtn(){
        return btn;
    }

    public TextView getTextView(){
        return text_view;
    }

    public Integer getLineNum(){
        return line_number;
    }

    public Boolean getExpand(){
        return isSelect;
    }
    /**
     * 是否展开
     * @param expand
     */
    public void setExpand(Boolean expand){
        isSelect=expand;
//        //清除文本视图的动画
//        text_view.clearAnimation();
//        final int deltaValue;
//        //获得文本视图的实际高度
//        final int startValue = text_view.getHeight();
//        if (isSelect) {//如果选中则展开后面的所有文字  getLineCount():获取TextView文字行数
//            //结果为新增的文本视图的高度
//            deltaValue = (text_view.getLineHeight() + 8) * text_view.getLineCount() - startValue;
////                btn.setText("隐藏更多");
//
//            //翻转icon的180度旋转动画
//            RotateAnimation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//            animation.setDuration(durationMillis);
//            animation.setFillAfter(true);
//            btn.startAnimation(animation);
//        } else {
//            //结果为0
//            deltaValue = (text_view.getLineHeight() + 8) * line_number - startValue;
////                btn.setText("查看更多");
//
//
//            //翻转icon的180度旋转动画
//            RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//            animation.setDuration(durationMillis);
//            animation.setFillAfter(true);
//            btn.startAnimation(animation);
//        }
//        //创建一个文字展开 收缩动画
//        Animation animation = new Animation() {
//            //该方法就是动画的具体实现
//                /*
//                    第一个参数：interpolatedTime代表动画的时间进行比。
//                    不管动画实际的持续时间如何，当动画播放时，该参数总是自动从0变化到1
//                    第二个参数：Transformation t代表了补间动画在不同时刻对图形或组件的变形程度。
//                 */
//            @Override
//            protected void applyTransformation(float interpolatedTime, Transformation t) {
//                //随着时间的流逝重新设置文本的行高
//                text_view.setHeight((int) (startValue + deltaValue * interpolatedTime));
//            }
//        };
//        //设置动画的持续时间为500毫秒
//        animation.setDuration(durationMillis);
//        //开始文本视图的动画展示
//        text_view.startAnimation(animation);
//
//        text_view.setText(content);
//        final int deltaValue;
////        //获得文本视图的实际高度
//        final int startValue = text_view.getHeight();
//        if(isSelect){
//            deltaValue = (text_view.getLineHeight() + 8) * text_view.getLineCount() - startValue;
//            text_view.setHeight(height);
//            Logger.e("类型11111111111设置高度="+deltaValue);
//        }else {
//            deltaValue = (text_view.getLineHeight() + 8) * line_number - startValue;
//            text_view.setHeight(height);
//            Logger.e("类型2222222设置高度="+deltaValue);
//        }

//        text_view.post(new Runnable() {
//            @Override
//            public void run() {
//                btn.setVisibility(text_view.getLineCount() > line_number ? View.VISIBLE : View.GONE);
//        Logger.e(text_view.getLineCount() +"===="+line_number);
//            }
//        });
    }
    public void setLine_number(int line_number){
        this.line_number=line_number;
    }

    /**
     * 重置状态
     */
    public void reset(){
        isSelect = false;
        //清除文本视图的动画
        text_view.clearAnimation();
        final int deltaValue;
        //获得文本视图的实际高度
        final int startValue = text_view.getHeight();
        //结果为0
        deltaValue = (text_view.getLineHeight() + 8) * line_number - startValue;
        //翻转icon的180度旋转动画
//        RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//        animation.setDuration(durationMillis);
//        animation.setFillAfter(true);
//        btn.startAnimation(animation);
        //创建一个文字展开 收缩动画
        Animation animation = new Animation() {
            //该方法就是动画的具体实现
                /*
                    第一个参数：interpolatedTime代表动画的时间进行比。
                    不管动画实际的持续时间如何，当动画播放时，该参数总是自动从0变化到1
                    第二个参数：Transformation t代表了补间动画在不同时刻对图形或组件的变形程度。
                 */
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                //随着时间的流逝重新设置文本的行高
                text_view.setHeight((int) (startValue + deltaValue * interpolatedTime));
            }
        };
        //设置动画的持续时间为500毫秒
        animation.setDuration(0);
        //开始文本视图的动画展示
        text_view.startAnimation(animation);
        text_view.setText(content);
    }

    /**
     * 设置内容
     * @param content
     */
    public void setContent(String content){
     this.content=content;
     text_view.setText(content);
    }

}
